home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xlock / image.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  3KB  |  112 lines

  1. #ifndef lint
  2. static char sccsid[] = "@(#)image.c    1.7 91/05/24 XLOCK";
  3. #endif
  4. /*-
  5.  * image.c - image bouncer for xlock, the X Window System lockscreen.
  6.  *
  7.  * Copyright (c) 1991 by Patrick J. Naughton.
  8.  *
  9.  * See xlock.c for copying information.
  10.  *
  11.  * Revision History:
  12.  * 29-Jul-90: Written.
  13.  */
  14.  
  15. #include "xlock.h"
  16. #include "sunlogo.bit"
  17.  
  18. static XImage logo = {
  19.     0, 0,            /* width, height */
  20.     0, XYBitmap, 0,        /* xoffset, format, data */
  21.     LSBFirst, 8,        /* byte-order, bitmap-unit */
  22.     LSBFirst, 8, 1        /* bitmap-bit-order, bitmap-pad, depth */
  23. };
  24.  
  25. #define MAXICONS 256
  26.  
  27. typedef struct {
  28.     int         x;
  29.     int         y;
  30. }           point;
  31.  
  32. typedef struct {
  33.     int         width;
  34.     int         height;
  35.     int         nrows;
  36.     int         ncols;
  37.     int         xb;
  38.     int         yb;
  39.     int         iconmode;
  40.     int         iconcount;
  41.     point       icons[MAXICONS];
  42.     long        startTime;
  43. }           imagestruct;
  44.  
  45. static imagestruct ims[MAXSCREENS];
  46.  
  47. void
  48. drawimage(win)
  49.     Window      win;
  50. {
  51.     imagestruct *ip = &ims[screen];
  52.     int         i;
  53.  
  54.     XSetForeground(dsp, Scr[screen].gc, BlackPixel(dsp, screen));
  55.     for (i = 0; i < ip->iconcount; i++) {
  56.     if (!ip->iconmode)
  57.         XFillRectangle(dsp, win, Scr[screen].gc,
  58.                ip->xb + sunlogo_width * ip->icons[i].x,
  59.                ip->yb + sunlogo_height * ip->icons[i].y,
  60.                sunlogo_width, sunlogo_height);
  61.  
  62.     ip->icons[i].x = random() % ip->ncols;
  63.     ip->icons[i].y = random() % ip->nrows;
  64.     }
  65.     if (Scr[screen].npixels == 2)
  66.     XSetForeground(dsp, Scr[screen].gc, WhitePixel(dsp, screen));
  67.     for (i = 0; i < ip->iconcount; i++) {
  68.     if (Scr[screen].npixels > 2)
  69.         XSetForeground(dsp, Scr[screen].gc,
  70.              Scr[screen].pixels[random() % Scr[screen].npixels]);
  71.  
  72.     XPutImage(dsp, win, Scr[screen].gc, &logo,
  73.           0, 0,
  74.           ip->xb + sunlogo_width * ip->icons[i].x,
  75.           ip->yb + sunlogo_height * ip->icons[i].y,
  76.           sunlogo_width, sunlogo_height);
  77.     }
  78. }
  79.  
  80. void
  81. initimage(win)
  82.     Window      win;
  83. {
  84.     XWindowAttributes xgwa;
  85.     imagestruct *ip = &ims[screen];
  86.  
  87.     ip->startTime = seconds();
  88.  
  89.     logo.data = (char *) sunlogo_bits;
  90.     logo.width = sunlogo_width;
  91.     logo.height = sunlogo_height;
  92.     logo.bytes_per_line = (sunlogo_width + 7) / 8;
  93.  
  94.     XGetWindowAttributes(dsp, win, &xgwa);
  95.     ip->width = xgwa.width;
  96.     ip->height = xgwa.height;
  97.     ip->ncols = ip->width / sunlogo_width;
  98.     ip->nrows = ip->height / sunlogo_height;
  99.     ip->iconmode = (ip->ncols < 2 || ip->nrows < 2);
  100.     if (ip->iconmode) {
  101.     ip->xb = 0;
  102.     ip->yb = 0;
  103.     ip->iconcount = 1;    /* icon mode */
  104.     } else {
  105.     ip->xb = (ip->width - sunlogo_width * ip->ncols) / 2;
  106.     ip->yb = (ip->height - sunlogo_height * ip->nrows) / 2;
  107.     ip->iconcount = batchcount;
  108.     }
  109.     XSetForeground(dsp, Scr[screen].gc, BlackPixel(dsp, screen));
  110.     XFillRectangle(dsp, win, Scr[screen].gc, 0, 0, ip->width, ip->height);
  111. }
  112.